package com.sp.ThreadUse;

/**
 * 线程使用应用案例  - 实现Runnable接口
 * 编写程序, 该程序可以每隔1秒, 在控制台输出"hi", 当输出10次后, 自动退出. 请使用实现Runnable接口的方式实现
 * 这里底层使用了设计模式(代理模式)
 */
public class Thread02 {
    public static void main(String[] args) {
//        Dog dog = new Dog();
////        dog.run();//run方法只是一个普通方法, 并不会真正起一个线程, 所以不能这样调用
//        Thread thread = new Thread(dog);
//        thread.start();




        Tiger tiger = new Tiger();
        ThreadProxy threadProxy = new ThreadProxy(tiger);
        threadProxy.start();
    }
}

class Animal {}
class Tiger extends Animal implements Runnable {

    @Override
    public void run() {
        System.out.println("老虎嗷嗷叫......");
    }
}

//线程代理类, 模拟一个极简的Thread类
class ThreadProxy implements Runnable {//可以将这里的Proxy当成Thread类

    private Runnable target = null;//属性, 类型是Runnable

    @Override
    public void run() {
        if (target != null){
            target.run();
        }
    }
    public ThreadProxy(Runnable target){
        this.target = target;
    }

    public void start(){
        start0();//这个方法是真正实现多线程的方法
    }

    public void start0(){
        run();
    }

}

class Dog implements Runnable {//通过实现Runnable接口, 开发线程

    int count = 0;
    @Override
    public void run() {//普通方法
        while (true) {
            System.out.println("hi " + (++count)+ " " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count == 10){
                break;
            }
        }
    }
}